/**
 * @author coderY
 * @description 监听路由页面、监听请求
 * @date 2023-03-21 14:56:11
 */

// 监听路由页面、监听请求
export default async function () {
	let Debug = false;
	//自定义路由拦截, 需要登录的页面
	const { "router": { needLogin, visitor, login } } = useRuntimeConfig();
	// 监听事件
	let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
	// 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
	list.forEach(item => {
		uni.addInterceptor(item, {
			// 调用前拦截
			invoke(e) {
				uni.hideLoading();
				console.log('invoke', e)
				//获取用户的token
				const token = uni.getStorageSync('uni_id_token'),
					// token是否已失效
					// tokenExpired = uni.getStorageSync('uni_id_token_expired') < Date.now(),
					tokenExpired = false,
					// 获取要跳转的页面路径（url去掉"?"和"?"后的参数）
					url = e.url.split('?')[0];
				// 获取要前往的页面路径（即url去掉"?"和"?"后的参数）
				const pages = getCurrentPages();
				if (!pages.length) {
					console.log("首页启动调用了");
					console.log(e);
					return e;
				}
				// const fromUrl = pages[pages.length - 1].route;
				// let inLoginPage = fromUrl.split('/')[2] == 'login';
				// 控制登录优先级,判断当前窗口是否为登录页面，如果是则不重定向路由
				// if (url == '/pages/ucenter/login/inde' && !inLoginPage) {
				// 	//一键登录（univerify）、账号（username）、验证码登录（短信smsCode）
				// 	if (login[0] == 'username')
				// 		e.url = "/pages/ucenter/login-page/pwd-login/pwd-login"
				// 	else {
				// 		//添加参数之前判断是否带了`？`号如果没有就补上，因为当开发场景本身有参数的情况下是已经带了`？`号
				// 		if (e.url == url)
				// 			e.url += '?'
				// 		e.url += "type=" + login[0]
				// 	}
				// } else {
				// 拦截强制登录页面
				let pass = true;
				// 校验需要登录页面
				if (needLogin) {
					pass = needLogin.every((item) => {
						if (typeof (item) == 'object' && item.pattern)
							return !item.pattern.test(url)
						return url != item
					});
				}
				// 校验不需要登录页面白名单
				if (visitor) {
					pass = visitor.some((item) => {
						if (typeof (item) == 'object' && item.pattern) {
							return item.pattern.test(url)
						}
						return url == item;
					})
				}
				if (!pass && (token == '' || tokenExpired)) {
					uni.showToast({ title: '请先登录', icon: 'none' });
					return false;
				}
				// }
				return e;
			},
			fail(err) { // 失败回调拦截 
				if (Debug) {
					uni.showModal({
						content: JSON.stringify(err),
						showCancel: false
					});
				}
			}
		});
	});
	// 监听请求方法
	let callFunctionOption;
	uni.addInterceptor('request', {
		invoke(request) {
			console.log("request", request);
			if (!request?.hideLoading)
				uni.showLoading({ title: request?.loadingTitle ? request?.loadingTitle : '加载中...' });

			// 添加默认URl基本链接 
			if (process.env.NODE_ENV === 'production')
				request.url = useRuntimeConfig().target.BASEURL + request.url;

			// 给所有请求添加自定义header'Bearer ' 
			console.log('uni_id_token', uni.getStorageSync('uni_id_token'));
			if (request.header)
				request.header['Authorization'] = uni.getStorageSync('uni_id_token');
			else
				request.header = { 'Authorization': uni.getStorageSync('uni_id_token') };
			// 防止缓存
			if (request.method === 'POST' && request.header['Content-Type'] !== 'multipart/form-data') {
				request.body = {
					...request.body,
					_t: Date.parse(new Date()) / 1000
				}
			} else if (request.method === 'GET') {
				request.params = {
					_t: Date.parse(new Date()) / 1000,
					...request.params
				}
			}
			// 复制回调方法
			callFunctionOption = request;
			return request
		},

		fail(err) {
			if (Debug) {
				uni.showModal({
					content: JSON.stringify(e),
					showCancel: false
				});
				uni.hideLoading();
			} else {
				uni.showModal({
					title: '提示',
					content: "系统错误请稍后再试！",
					showCancel: false,
					confirmColor: '#536091',
					confirmText: "知道了"
				});
				uni.hideLoading();
			}
			//如果执行错误，检查是否断网
			uni.getNetworkType({
				complete: res => {
					console.log(res);
					if (res.networkType == 'none') {
						uni.showToast({
							title: '手机网络异常',
							icon: 'none'
						});
						console.log('手机网络异常');
						let callBack = res => {
							console.log(res);
							if (res.isConnected) {
								uni.showToast({
									title: '恢复联网自动重新执行',
									icon: 'none'
								});
								console.log(res.networkType, "恢复联网自动重新执行");
								uni.offNetworkStatusChange(e => {
									console.log("移除监听成功", e);
								})
								//恢复联网自动重新执行
								uni.request(callFunctionOption)
							}
						}
					}
				}
			});
		},
		success: (e) => {
			switch (e.data.code) {
				case 401:
					uni.showToast({ icon: 'none', title: '系统繁忙' });
					break;
				default:
					uni.hideLoading();
					console.log('code的值是：' + e.data.code, '可以在上面添加case，自动处理响应体');
					break;
			}
			uni.hideLoading();
		}
	});
}

function $showModal(msg, callback, confirmText = '知道了') {
	uni.showModal({
		title: '提示',
		content: msg,
		showCancel: false,
		confirmText,
		confirmColor: '#536091',
		success: (res) => {
			if (res.confirm)
				callback && callback();
		}
	});
}


function getQueryParam(paramName) {
	const urlParams = new URLSearchParams(window.location.search);
	return urlParams.get(paramName);
}